package com.edu.bean;

import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

/**
 * @Author:mx
 * @Date:2025/11/7-9:28:57
 */
public class MyIOC {

    //提供一个Map 来装 其他的被管理的对象(容器真正是吧数据放在 box)里
    private Map<String,Object> box;
    //提供一个 Properties 用于读取 Properties配置文件 (配置文件里包含了 beanId和className)
    private Properties pro ;

    //提供构造方法，要求构造容器 时必须传入 配置文件的路径
    public MyIOC(String path){
        //创建容器时，初始化box
        box = new HashMap<>();
        //调用方法 读取配置文件
        readPath(path);
    }

    public Object getBean(String beanId){
        return box.get(beanId);
    }

    //只负责读取 配置文件
    public void readPath(String path){
        pro = new Properties();
        InputStream inputStream = MyIOC.class.getClassLoader().getResourceAsStream(path);
        try {
            //加载配置文件
            pro.load(inputStream);
            //调用容器的初始化方法，目的创建配置文件里的对象。
            init();
        } catch (IOException e) {
            System.out.println("配置文件不存在");
            e.printStackTrace();
        }
    }
    //根据配置文件里的数据，创建对象，并且把对象放入到box
    public void init(){
        //获取配置文件里的所有的key
        Set<String> beanIds = pro.stringPropertyNames();
        //创建对象
        for (String id : beanIds) {
            //根据key 找到对应的 value(类的完整限定名)
            String className = pro.getProperty(id);
            try {
                //类加载
                Class clazz = Class.forName(className);
                //调用对象的无参数构造方法
                Object o = clazz.newInstance();
                //把对象放入到box中
                box.put(id,o);
            } catch (ClassNotFoundException e) {
                System.out.println("找不到指定的类型");
                e.printStackTrace();
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                System.out.println("没有公开的无参构造方法");
                e.printStackTrace();
            }
        }
    }


}
